#include "stm32f10x.h"
#include "key.h"
#include "sys.h" 
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK精英STM32开发板
//按键驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/3
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
//////////////////////////////////////////////////////////////////////////////////  

// 定义按键状态标志
volatile uint8_t key0_debounce_flag = 0;
volatile uint8_t key1_debounce_flag = 0;
volatile uint8_t wkup_debounce_flag = 0;
// 新增按键按下标志
volatile uint8_t key0_pressed = 0;
volatile uint8_t key1_pressed = 0;
volatile uint8_t wkup_pressed = 0;


// 定时器初始化函数
void TIM_Configuration(void) 
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能定时器时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    // 定时器基本配置
    TIM_TimeBaseStructure.TIM_Period = 10 - 1; // 10ms 定时
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / 1000000 - 1; // 1MHz 计数频率
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    // 使能定时器中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    // 配置 NVIC
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 不自动启动定时器
    // TIM_Cmd(TIM2, ENABLE);
}

// 按键初始化函数，使用外部中断
void KEY_Init(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // ... 已有代码 ...

    // 初始化定时器
    TIM_Configuration();
}

// KEY0 中断服务函数 (PE4 -> EXTI4)
void EXTI4_IRQHandler(void) 
{
    if(EXTI_GetITStatus(EXTI_Line4) != RESET) 
    {
        key0_debounce_flag = 1; // 置位消抖标志
        EXTI_ClearITPendingBit(EXTI_Line4);  // 清除中断标志
        TIM_Cmd(TIM2, ENABLE); // 启动定时器
    }
}

// KEY1 中断服务函数 (PE3 -> EXTI3)
void EXTI3_IRQHandler(void) 
{
    if(EXTI_GetITStatus(EXTI_Line3) != RESET) 
    {
        key1_debounce_flag = 1; // 置位消抖标志
        EXTI_ClearITPendingBit(EXTI_Line3);  // 清除中断标志
        TIM_Cmd(TIM2, ENABLE); // 启动定时器
    }
}

// WK_UP 中断服务函数 (PA0 -> EXTI0)
void EXTI0_IRQHandler(void) 
{
    if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
    {
        wkup_debounce_flag = 1; // 置位消抖标志
        EXTI_ClearITPendingBit(EXTI_Line0);  // 清除中断标志
        TIM_Cmd(TIM2, ENABLE); // 启动定时器
    }
}

// 定时器 2 中断服务函数
void TIM2_IRQHandler(void) 
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
    {
        // 处理 KEY0 消抖
        if (key0_debounce_flag) 
        {
            if (KEY0 == 0 && !key0_pressed) 
            {
                // 确认按键按下
                printf("KEY0 pressed!\r\n");
                key0_pressed = 1; // 标记按键已按下
            }
            else if (KEY0 == 1 && key0_pressed) 
            {
                key0_pressed = 0; // 标记按键已释放
            }
            // 清除消抖标志
            key0_debounce_flag = 0; 
        }

        // 处理 KEY1 消抖
        if (key1_debounce_flag) 
        {
            if (KEY1 == 0 && !key1_pressed) 
            {
                // 确认按键按下
                printf("KEY1 pressed!\r\n");
                key1_pressed = 1; // 标记按键已按下
            }
            else if (KEY1 == 1 && key1_pressed) 
            {
                key1_pressed = 0; // 标记按键已释放
            }
            // 清除消抖标志
            key1_debounce_flag = 0; 
        }

        // 处理 WK_UP 消抖
        if (wkup_debounce_flag) 
        {
            if (WK_UP == 1 && !wkup_pressed) 
            {
                // 确认按键按下
                printf("WK_UP pressed!\r\n");
                wkup_pressed = 1; // 标记按键已按下
            }
            else if (WK_UP == 0 && wkup_pressed) 
            {
                wkup_pressed = 0; // 标记按键已释放
            }
            // 清除消抖标志
            wkup_debounce_flag = 0; 
        }

        // 检查是否所有消抖标志都为 0，若为 0 则关闭定时器
        if (!key0_debounce_flag && !key1_debounce_flag && !wkup_debounce_flag) {
            TIM_Cmd(TIM2, DISABLE);
        }

        // 清除定时器中断标志
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 
    }
}
